/*
    KMC Simulation
    Copyright (c) 2012-14 Filip Rozbořil

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "Random.h"

class Event
{
	private:
		double mRate;
		uint64_t mCount;
	protected:
		virtual void execute(Random* r)=0;
 	public:
 		Event() : mRate(0.), mCount(UINT64_C(0)) { }
 		Event(double rate) : mRate(rate), mCount(UINT64_C(0)) { }
 		virtual ~Event() { }
 		double getRate() { return mRate; }
 		void setRate(double rate) { mRate = rate; }
 		int64_t getCount() { return mCount; }
 		void handle(Random* r) { Trace("Handling event: " << getName()); mCount++; execute(r); }
 		virtual string getName()=0;
 		virtual void printCount(ostream& os) { os << "    " << getName() << ": " << getCount() << endl; }
};



